package com.ujiuye.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import java.util.LinkedList;
import java.util.List;

/**
 * 统计在线人数
 * ServletContextListener 监听ServletContext创建和销毁
 * HttpSessionAttributeListener 监听session中作用域值的变化
 *
 * 1、准备登录页面
 *      只要账号不为空 ，登录成功  将账号放到session中，跳转到主页
 *      账号为空  跳转到登录页面
 * 2、监听ServletContext 创建，准备list集合 存储到ServletContext作用域中
 *
 * 3、session中添加值
 *      获取到ServletContext这个对象，获取该对象的list集合
 *         将用户名添加到list集合中
 *         在将list集合放到ServletContext作用域中
 * 4、session中修改值
 *
 *      获取到ServletContext这个对象，获取该对象的list集合
 *          将用户名添加到list集合中
 *          在将list集合放到ServletContext作用域中
 */
@WebListener
public class OnlineListener implements ServletContextListener, HttpSessionAttributeListener {
    private  ServletContext sc;
    // //初始化ServletContext 启动tomcat就创建
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //获取
        sc = sce.getServletContext();
        List<String> online = new LinkedList<>();
        sc.setAttribute("online",online);
    }

    //监听向session中添加键值对
    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        String name = se.getName();
        //判断name是否是username 如果是说明登录成功
        if("username".equals(name)) {
            String value = (String) se.getValue();
            //从sc中获取list集合
            LinkedList<String> online = (LinkedList<String>) sc.getAttribute("online");
            //将value添加到集合中
            online.add(value);
            sc.setAttribute("online",online);

        }
    }


    /**
     * 替换session中的键值对
     * @param se
     * 张三   add   1
     * 李四   修改  1
     */
    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        String name = se.getName();
        if("username".equals(name)) {
            //se.getValue(); 获取的是修改之前的  不需要

            //获取修改之后的
            String value = (String) se.getSession().getAttribute(name);
            LinkedList<String> online = (LinkedList<String>) sc.getAttribute("online");
            online.add(value);
            sc.setAttribute("online",online);
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }



    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {

    }


}
